iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

JavaScript 是什麼?可以吃嗎?系列 第 10

Day10 - ES6 Set 實作聯集、交集和差集

  • 分享至 

  • xImage
  •  

嗨大家好,我是Eric ~
今天我們來談談一個非常實用的主題:如何用 JavaScript 實作集合的基本操作。集合是數學中的一個基本概念,也在程式設計中扮演著重要角色,接下來會講解三種主要的集合操作:聯集、交集和差集。

聯集(Union)

聯集是指包含所有給定集合的元素(不重複)的集合。

使用 Set

const union = [...new Set([...arr1, ...arr2])];
console.log(union) // [1, 2, 3, 4, 5, 6]

這一行的工作原理是這樣的:
...arr1, ...arr2:這會將 arr1 和 arr2 的所有元素展開。
new Set([...arr1, ...arr2]):這會創建一個新的 Set,並且自動去除任何重複的元素。
[...new Set([...arr1, ...arr2])]:最後,我們用展開運算符將 Set 轉換回一個 Array。

不使用 Set

如果你的環境不支持 Set,也可以這樣做:

let result = arr1.concat(arr2.filter((e)=>{
    return arr1.indexOf(e) === -1
}))
console.log(result) // [1, 2, 3, 4, 5, 6]

交集(Intersection)

交集是指包含所有在兩個或多個集合中都存在的元素的集合。

使用 Set

const intersect = [...new Set(arr1)].filter(item => arr2.includes(item));
console.log(intersect); // [3, 4, 5]

這裡,我們首先使用 new Set(arr1) 去除 arr1 中可能存在的重複元素,然後再過濾出那些也存在於 arr2 的元素。

不使用 Set

let intersect = arr1.filter((e) => {
    return arr2.indexOf(e) > -1;
});
console.log(intersect); // [3, 4, 5]

這個版本使用 filter 方法遍歷 arr1,並檢查每個元素是否也存在於 arr2 中(即 arr2.indexOf(e) > -1)。這是一個更直觀的方法來找到兩個數組的交集。

差集(Difference)

差集是指存在於第一個集合,但不存在於第二個集合中的元素組成的集合。

使用 Set

const difference = union.filter(item => !intersect.includes(item));
console.log(difference); // [1, 2]

不使用 Set

let difference = arr1.filter((e) => {
    return arr2.indexOf(e) === -1;
});
console.log(difference); // [1, 2]

這個版本同樣使用 filter 方法,但這次我們只保留那些不在 arr2 中的元素(即 arr2.indexOf(e) === -1)。

結論

以上就是如何在 JavaScript 中實作集合的基本操作。這些方法不僅是數學上的基本概念,而且在實際的程式設計問題中也非常有用,這次分享就到這邊,謝謝大家,明天見~


上一篇
Day9 - 陣列分組
下一篇
Day11- 使用SetProperty 自定義你的 CSS 變數
系列文
JavaScript 是什麼?可以吃嗎?20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言